#include <iostream>
#include <string>
#include "Master.hpp"
#include "Reactor.hpp"
#include "LIstener.hpp"
#include "Channel.hpp"
#include "./module/log.hpp"
#include "./module/comm.hpp"
#include "protocol.hpp"
#include "OnlineCal.hpp"

int main(int argc, char *argv[])
{
    if(argc != 2) {
        std::cerr << "Usage: " << argv[0] << "+ port" << std::endl;
        exit(USAGE_ERR);
    }
    uint32_t port = std::stoi(argv[1]);

    std::shared_ptr<onliecal> cal = std::make_shared<onliecal>();
    std::shared_ptr<protocol> pro = std::make_shared<protocol>([&cal](Request &req){
        return cal->Deal(req);
    });
    std::shared_ptr<Connection> listener = std::make_shared<Listener>(port);
    std::unique_ptr<Master> master = std::make_unique<Master>();
    master->Start();
}

//int main(int argc, char *argv[])
//{
//    if(argc != 2) {
//        std::cerr << "Usage: " << argv[0] << "+ port" << std::endl;
//        exit(USAGE_ERR);
//    }
//    uint32_t port = std::stoi(argv[1]);
//
//    // 1.创建一个业务模块
//    std::shared_ptr<onliecal> cal = std::make_shared<onliecal>();
//
//    // 2.创建protocol协议模块
//    std::shared_ptr<protocol> pro = std::make_shared<protocol>([&cal](Request &req) -> Response {
//        // 设置回调，当协议模块对报文解析之后，回调到业务模块
//        return cal->Deal(req);
//    });
//
//    // 3.创建一个listener，连接管理器
//    std::shared_ptr<Connection> listener = std::make_shared<Listener>(port);
//    listener->registerHandler([&pro](std::string &inbuffer) ->std::string {
//        // 设置普通套接字的回调函数，让协议模块对象去处理输入缓冲区中的内容
//        std::string package;
//        if(!pro->Decode(inbuffer, &package)) return std::string();
//        // 到这里就有一个完整的请求报文了
//        std::string resp = pro->execute(package);
//        return resp;
//    });
//
//    // 4.创建reactor
//    std::unique_ptr<Reactor> R = std::make_unique<Reactor>();
//    R->addConnection(listener);
//    R->loop();
//
//    return 0;
//}